package com.zkh.myutils.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;

public class NumberUtils {
	
	/**
	 * 格式化浮点数（四舍五入）
	 * @param number 需格式化的数字
	 * @param digit 最大保留小数位数
	 * @see NumberUtils#doubleFix(double number, int digit, boolean fill, boolean round)
	 */
	public static String doubleFix(String number, int digit){
		return doubleFix(new Double(number), digit, false);
	}
	
	/**
	 * 格式化浮点数（四舍五入）
	 * @param number 需格式化的数字
	 * @param digit 最大保留小数位数
	 * @param fill 如果小数位数不足，是否用0填充
	 * @see NumberUtils#doubleFix(double number, int digit, boolean fill, boolean round)
	 */
	public static String doubleFix(String number, int digit, boolean fill){
		return doubleFix(new Double(number), digit, fill);
	}
	
	/**
	 * 格式化浮点数（四舍五入）
	 * @param number 需格式化的数字
	 * @param digit 最大保留小数位数
	 * @see NumberUtils#doubleFix(double number, int digit, boolean fill, boolean round)
	 */
	public static String doubleFix(double number, int digit){
		return doubleFix(number, digit, false);
	}
	
	/**
	 * 格式化浮点数（四舍五入）
	 * @param number 需格式化的数字
	 * @param digit 最大保留小数位数
	 * @param fill 如果小数位数不足，是否用0填充
	 * @see NumberUtils#doubleFix(double number, int digit, boolean fill, boolean round)
	 */
	public static String doubleFix(double number, int digit, boolean fill){
		return doubleFix(number, digit, fill, true);
	}
	
	/**
	 * 格式化浮点数
	 * @param number 需格式化的数字
	 * @param digit 最大保留小数位数
	 * @param fill 如果小数位数不足，是否用0填充
	 * @param round 是否四舍五入，false直接截取
	 */
	public static String doubleFix(double number, int digit, boolean fill, boolean round){
		//格式对象
		NumberFormat nf = NumberFormat.getInstance();
		//最大小数位数
		nf.setMaximumFractionDigits(digit);
		//直接截取，不四舍五入
		if(!round){
			nf.setRoundingMode(RoundingMode.DOWN);
		}
		//是否填充0
		if(fill){
			nf.setMinimumFractionDigits(digit);
		}
		//返回格式化后的数据
		return nf.format(number);
	}
	
	/**
	 * 将数字格式化为百分比（四舍五入）
	 * @param number 需格式化的数字
	 * @param digit 百分数的小数位数
	 */
	public static String rateFix(String number, int digit){
		return rateFix(new Double(number), digit);
	}
	
	/**
	 * 将数字格式化为百分比（四舍五入）
	 * @param number 需格式化的数字
	 * @param digit 百分数的小数位数
	 */
	public static String rateFix(double number, int digit){
		return rateFix(number, digit, true);
	}
	
	/**
	 * 将数字格式化为百分比
	 * @param number 需格式化的数字
	 * @param digit 百分数的小数位数
	 * @param round 是否四舍五入，false直接截取
	 */
	public static String rateFix(double number, int digit, boolean round){
		//格式对象
		NumberFormat nf = NumberFormat.getPercentInstance();
		//最大小数位数
		nf.setMaximumFractionDigits(digit);
		nf.setMinimumFractionDigits(digit);
		//直接截取，不四舍五入
		if(!round){
			nf.setRoundingMode(RoundingMode.DOWN);
		}
		//返回格式化后的数据
		return nf.format(number);
	}
	
	/**
	 * 加运算。没有数据返回-1。
	 * @param numbers 数据
	 */
	public static double addFix(double... numbers){
		return calculatorFix(1, 0, numbers);
	}
	
	/**
	 * 减运算。没有数据返回-1。
	 * @param numbers 数据
	 */
	public static double subtractFix(double... numbers){
		return calculatorFix(2, 0, numbers);
	}
	
	/**
	 * 乘运算。没有数据返回-1。
	 * @param numbers 数据
	 */
	public static double multiplyFix(double... numbers){
		return calculatorFix(3, 0, numbers);
	}
	
	/**
	 * 除运算。没有数据返回-1。
	 * @param digit 结果保留小数的位数（不能除尽时需要，四舍五入）
	 * @param numbers 数据。第一个是被除数，其余的均为除数，依次累除。
	 */
	public static double divideFix(int digit, double... numbers){
		return calculatorFix(4, digit, numbers);
	}
	
	/**
	 * 浮点数运算
	 * @param type 运算类型。（1：加，2：减，3：乘，4：除）
	 */
	private static double calculatorFix(int type, int digit, double... numbers){
		//参数长度
		int len = numbers==null ? 0 : numbers.length;
		//无数据
		if(len==0){
			return -1;
		}
		//第一个数字
		BigDecimal bd = new BigDecimal(numbers[0] + "");
		//遍历相加
		for(int i=1;i<len;i++){
			//临时值
			BigDecimal t = new BigDecimal(numbers[i] + "");
			switch(type){
				case 1:
					bd = bd.add(t);break;
				case 2:
					bd = bd.subtract(t);break;
				case 3:
					bd = bd.multiply(t);break;
				case 4:
					bd = bd.divide(t, digit, RoundingMode.HALF_UP);break;
			}
		}
		//返回值
		return bd.doubleValue();
	}
}
